home *** CD-ROM | disk | FTP | other *** search
/ Mac Power 1997 December / MACPOWER-1997-12.ISO.7z / MACPOWER-1997-12.ISO / AMUG / PROGRAMMING / Raven 1.2 Examples.sit / Raven 1.2 Examples / Quill / Source / AdornerEditor.cpp next >
Text File  |  1997-08-11  |  15KB  |  451 lines

  1. /*
  2.  *  File:       AdornerEditor.cpp
  3.  *  Summary:       A view that knows how to edit a pane's adorners.
  4.  *  Written by: Jesse Jones
  5.  *
  6.  *  Copyright ゥ 1996-1997 Jesse Jones. 
  7.  *    For conditions of distribution and use, see copyright notice in ZTypes.h  
  8.  *
  9.  *  Change History (most recent first):    
  10.  *
  11.  *         <3>     5/11/97    JDJ        Now allows user to specify color and pen.
  12.  *         <2>     4/06/97    JDJ        Updated for new style TSubPaneIterator.
  13.  *         <1>    11/24/96    JDJ        Created
  14.  */
  15.  
  16. #include "AdornerEditor.h"
  17.  
  18. #include <ZAdorners.h>
  19. #include <ZColorSwatch.h>
  20. #include <ZPaneAdorners.h>
  21. #include <ZStringUtils.h>
  22.  
  23. #include "RsrcPopupMenu.h"
  24.  
  25.  
  26. // ===================================================================================
  27. //    class CEditAdornersCommand
  28. // ===================================================================================
  29.  
  30. //---------------------------------------------------------------
  31. //
  32. // CEditAdornersCommand::~CEditAdornersCommand
  33. //
  34. //---------------------------------------------------------------
  35. CEditAdornersCommand::~CEditAdornersCommand()
  36. {
  37. }
  38.  
  39.  
  40. //---------------------------------------------------------------
  41. //
  42. // CEditAdornersCommand::CEditAdornersCommand
  43. //
  44. //---------------------------------------------------------------
  45. CEditAdornersCommand::CEditAdornersCommand(TPane* pane, const SAdornerInfo& oldInfo, const SAdornerInfo& newInfo) : Inherited(pane, oldInfo, newInfo)
  46. {
  47. }
  48.  
  49.  
  50. //---------------------------------------------------------------
  51. //
  52. // CEditAdornersCommand::UpdatePane
  53. //
  54. //---------------------------------------------------------------
  55. void CEditAdornersCommand::UpdatePane(const SAdornerInfo& info)
  56. {
  57.     TAdorner* adorner = nil;
  58.     
  59.     adorner = mPane->FindAdorner("TDefaultButtonAdorner");
  60.     if (info.hasDefaultButtonAdorner && adorner == nil)
  61.         mPane->AddAdorner(new TDefaultButtonAdorner);
  62.     else if (!info.hasDefaultButtonAdorner)
  63.         delete adorner;
  64.     
  65.     adorner = mPane->FindAdorner("TEraseAdorner");
  66.     if (info.hasEraseAdorner)
  67.         if (adorner == nil)
  68.             mPane->AddAdorner(new TEraseAdorner(info.eraseColor));
  69.         else
  70.             dynamic_cast<TEraseAdorner*>(adorner)->SetColor(info.eraseColor);
  71.     else if (!info.hasEraseAdorner)
  72.         delete adorner;
  73.     
  74.     adorner = mPane->FindAdorner("TFocusRectAdorner");
  75.     if (info.hasFocusAdorner && adorner == nil)
  76.         mPane->AddAdorner(new TFocusRectAdorner);
  77.     else if (!info.hasFocusAdorner)
  78.         delete adorner;
  79.     
  80.     adorner = mPane->FindAdorner("TFrameAdorner");
  81.     if (info.hasFrameAdorner)
  82.         if (adorner == nil)
  83.             mPane->AddAdorner(new TFrameAdorner(info.framePen));
  84.         else
  85.             dynamic_cast<TFrameAdorner*>(adorner)->SetPenID(info.framePen);
  86.     else if (!info.hasFrameAdorner)
  87.         delete adorner;
  88.     
  89.     adorner = mPane->FindAdorner("TLineBottomAdorner");
  90.     if (info.hasLineBottomAdorner)
  91.         if (adorner == nil)
  92.             mPane->AddAdorner(new TLineBottomAdorner(info.lineBottomPen));
  93.         else
  94.             dynamic_cast<TLineBottomAdorner*>(adorner)->SetPenID(info.lineBottomPen);
  95.     else if (!info.hasLineBottomAdorner)
  96.         delete adorner;
  97.     
  98.     adorner = mPane->FindAdorner("TLineLeftAdorner");
  99.     if (info.hasLineLeftAdorner)
  100.         if (adorner == nil)
  101.             mPane->AddAdorner(new TLineLeftAdorner(info.lineLeftPen));
  102.         else
  103.             dynamic_cast<TLineLeftAdorner*>(adorner)->SetPenID(info.lineLeftPen);
  104.     else if (!info.hasLineLeftAdorner)
  105.         delete adorner;
  106.     
  107.     adorner = mPane->FindAdorner("TLineRightAdorner");
  108.     if (info.hasLineRightAdorner)
  109.         if (adorner == nil)
  110.             mPane->AddAdorner(new TLineRightAdorner(info.lineRightPen));
  111.         else
  112.             dynamic_cast<TLineRightAdorner*>(adorner)->SetPenID(info.lineRightPen);
  113.     else if (!info.hasLineRightAdorner)
  114.         delete adorner;
  115.     
  116.     adorner = mPane->FindAdorner("TLineTopAdorner");
  117.     if (info.hasLineTopAdorner)
  118.         if (adorner == nil)
  119.             mPane->AddAdorner(new TLineTopAdorner(info.lineTopPen));
  120.         else
  121.             dynamic_cast<TLineTopAdorner*>(adorner)->SetPenID(info.lineTopPen);
  122.     else if (!info.hasLineTopAdorner)
  123.         delete adorner;
  124.     
  125.     adorner = mPane->FindAdorner("TRoundRectAdorner");
  126.     if (info.hasRoundRectAdorner)
  127.         if (adorner == nil)
  128.             mPane->AddAdorner(new TRoundRectAdorner(info.roundRectPen));
  129.         else
  130.             dynamic_cast<TRoundRectAdorner*>(adorner)->SetPenID(info.roundRectPen);
  131.     else if (!info.hasRoundRectAdorner)
  132.         delete adorner;
  133.     
  134.     adorner = mPane->FindAdorner("TShadowedFrameAdorner");
  135.     if (info.hasShadowAdorner)
  136.         if (adorner == nil)
  137.             mPane->AddAdorner(new TShadowedFrameAdorner(info.shadowColor));
  138.         else
  139.             dynamic_cast<TShadowedFrameAdorner*>(adorner)->SetColor(info.shadowColor);
  140.     else if (!info.hasShadowAdorner)
  141.         delete adorner;
  142.     
  143.     adorner = mPane->FindAdorner("TSuppressDrawingAdorner");
  144.     if (info.hasSupressAdorner && adorner == nil)
  145.         mPane->AddAdorner(new TSuppressDrawingAdorner);
  146.     else if (!info.hasSupressAdorner)
  147.         delete adorner;
  148.         
  149.     mPane->Invalidate();
  150. }
  151.  
  152. #pragma mark -
  153.  
  154. // ===================================================================================
  155. //    CAdornerEditor
  156. // ===================================================================================
  157.  
  158. static TReanimatorRegister<CAdornerEditor> sAdornersEditorRegistrar;
  159.  
  160. //---------------------------------------------------------------
  161. //
  162. // CAdornerEditor::~CAdornerEditor
  163. //
  164. //---------------------------------------------------------------
  165. CAdornerEditor::~CAdornerEditor()
  166. {
  167. }
  168.  
  169.  
  170. //---------------------------------------------------------------
  171. //
  172. // CAdornerEditor::CAdornerEditor
  173. //
  174. //---------------------------------------------------------------
  175. CAdornerEditor::CAdornerEditor(TView* superView) : CRootPaneEditor(superView)
  176. {
  177.     mPane = nil;
  178. }
  179.  
  180.  
  181. //---------------------------------------------------------------
  182. //
  183. // CAdornerEditor::Create                                [static]
  184. //
  185. //---------------------------------------------------------------
  186. MReanimatable* CAdornerEditor::Create(MReanimatable* parent)
  187. {
  188.     return new CAdornerEditor(dynamic_cast<TView*>(parent));
  189. }
  190.  
  191.  
  192. //---------------------------------------------------------------
  193. //
  194. // CAdornerEditor::SetPane
  195. //
  196. //---------------------------------------------------------------
  197. void CAdornerEditor::SetPane(TPane* pane)
  198. {
  199.     ASSERT(pane != nil);
  200.     ASSERT(mPane == nil);
  201.     
  202.     mPane = dynamic_cast<TPane*>(pane);
  203.     ASSERT(mPane != nil);
  204.     
  205.     mOldInfo = this->GetPaneInfo();
  206.         
  207.     this->SetEditorInfo(mOldInfo);
  208. }
  209.  
  210.  
  211. //---------------------------------------------------------------
  212. //
  213. // CAdornerEditor::Apply
  214. //
  215. //---------------------------------------------------------------
  216. void CAdornerEditor::Apply()
  217. {
  218.     SAdornerInfo info = this->GetEditorInfo();
  219.     
  220.     this->SetPaneInfo(info);
  221. }
  222.  
  223.  
  224. //---------------------------------------------------------------
  225. //
  226. // CAdornerEditor::Commit
  227. //
  228. //---------------------------------------------------------------
  229. void CAdornerEditor::Commit(TMultipleUndoableCommand* command)
  230. {
  231.     SAdornerInfo newInfo = this->GetEditorInfo();
  232.  
  233.     command->AddCommand(new CEditAdornersCommand(mPane, mOldInfo, newInfo));
  234. }
  235.  
  236.  
  237. //---------------------------------------------------------------
  238. //
  239. // CAdornerEditor::Revert
  240. //
  241. //---------------------------------------------------------------
  242. void CAdornerEditor::Revert()
  243. {
  244.     this->SetEditorInfo(mOldInfo);
  245.     this->SetPaneInfo(mOldInfo);
  246. }
  247.  
  248.  
  249. //---------------------------------------------------------------
  250. //
  251. // CAdornerEditor::GetPaneInfo        
  252. //
  253. //---------------------------------------------------------------
  254. SAdornerInfo CAdornerEditor::GetPaneInfo() const
  255. {
  256.     SAdornerInfo info;
  257.     
  258.     TAdorner* adorner = nil;
  259.     
  260.     adorner = mPane->FindAdorner("TDefaultButtonAdorner");
  261.     info.hasDefaultButtonAdorner = adorner != nil;
  262.     
  263.     adorner = mPane->FindAdorner("TEraseAdorner");
  264.     info.hasEraseAdorner = adorner != nil;
  265.     if (adorner != nil)
  266.         info.eraseColor = dynamic_cast<TEraseAdorner*>(adorner)->GetColor();
  267.     else
  268.         info.eraseColor = kRGBWhite;
  269.     
  270.     adorner = mPane->FindAdorner("TFocusRectAdorner");
  271.     info.hasFocusAdorner = adorner != nil;
  272.     
  273.     adorner = mPane->FindAdorner("TFrameAdorner");
  274.     info.hasFrameAdorner = adorner != nil;
  275.     if (adorner != nil)
  276.         info.framePen = dynamic_cast<TFrameAdorner*>(adorner)->GetPenID();
  277.     else
  278.         info.framePen = 0;
  279.     
  280.     adorner = mPane->FindAdorner("TLineLeftAdorner");
  281.     info.hasLineLeftAdorner = adorner != nil;
  282.     if (adorner != nil)
  283.         info.lineLeftPen = dynamic_cast<TLineLeftAdorner*>(adorner)->GetPenID();
  284.     else
  285.         info.lineLeftPen = 0;
  286.     
  287.     adorner = mPane->FindAdorner("TLineRightAdorner");
  288.     info.hasLineRightAdorner = adorner != nil;
  289.     if (adorner != nil)
  290.         info.lineRightPen = dynamic_cast<TLineRightAdorner*>(adorner)->GetPenID();
  291.     else
  292.         info.lineRightPen = 0;
  293.     
  294.     adorner = mPane->FindAdorner("TLineBottomAdorner");
  295.     info.hasLineBottomAdorner = adorner != nil;
  296.     if (adorner != nil)
  297.         info.lineBottomPen = dynamic_cast<TLineBottomAdorner*>(adorner)->GetPenID();
  298.     else
  299.         info.lineBottomPen = 0;
  300.     
  301.     adorner = mPane->FindAdorner("TLineTopAdorner");
  302.     info.hasLineTopAdorner = adorner != nil;
  303.     if (adorner != nil)
  304.         info.lineTopPen = dynamic_cast<TLineTopAdorner*>(adorner)->GetPenID();
  305.     else
  306.         info.lineTopPen = 0;
  307.     
  308.     adorner = mPane->FindAdorner("TRoundRectAdorner");
  309.     info.hasRoundRectAdorner = adorner != nil;
  310.     if (adorner != nil)
  311.         info.roundRectPen = dynamic_cast<TRoundRectAdorner*>(adorner)->GetPenID();
  312.     else
  313.         info.roundRectPen = 0;
  314.     
  315.     adorner = mPane->FindAdorner("TShadowedFrameAdorner");
  316.     info.hasShadowAdorner = adorner != nil;
  317.     if (adorner != nil)
  318.         info.shadowColor = dynamic_cast<TShadowedFrameAdorner*>(adorner)->GetColor();
  319.     else
  320.         info.shadowColor = kRGBBlack;
  321.     
  322.     adorner = mPane->FindAdorner("TSuppressDrawingAdorner");
  323.     info.hasSupressAdorner = adorner != nil;
  324.     
  325.     return info;
  326. }
  327.  
  328.  
  329. //---------------------------------------------------------------
  330. //
  331. // CAdornerEditor::SetPaneInfo
  332. //
  333. //---------------------------------------------------------------
  334. void CAdornerEditor::SetPaneInfo(const SAdornerInfo& info)
  335. {
  336.     TAutoPtr<CEditAdornersCommand> command(new CEditAdornersCommand(mPane, mOldInfo, info));
  337.  
  338.     command->UpdatePane(info);        
  339. }
  340.  
  341.  
  342. //---------------------------------------------------------------
  343. //
  344. // CAdornerEditor::GetEditorInfo        
  345. //
  346. //---------------------------------------------------------------
  347. SAdornerInfo CAdornerEditor::GetEditorInfo() const
  348. {
  349.     SAdornerInfo info;
  350.     
  351.     TControl* control = nil;
  352.             
  353.     control = dynamic_cast<TControl*>(this->FindSubPane("TDefaultButtonAdorner"));
  354.     info.hasDefaultButtonAdorner = control->GetValue() != 0;
  355.     
  356.     control = dynamic_cast<TControl*>(this->FindSubPane("TEraseAdorner"));
  357.     info.hasEraseAdorner = control->GetValue() != 0;
  358.     info.eraseColor = dynamic_cast<TColorSwatch*>(this->FindSubPane("Erase Color"))->GetColor();
  359.     
  360.     control = dynamic_cast<TControl*>(this->FindSubPane("TFocusRectAdorner"));
  361.     info.hasFocusAdorner = control->GetValue() != 0;
  362.     
  363.     control = dynamic_cast<TControl*>(this->FindSubPane("TFrameAdorner"));
  364.     info.hasFrameAdorner = control->GetValue() != 0;
  365.     info.framePen = dynamic_cast<CRsrcPopupMenu*>(this->FindSubPane("Frame Pen"))->GetID();
  366.     
  367.     control = dynamic_cast<TControl*>(this->FindSubPane("TLineLeftAdorner"));
  368.     info.hasLineLeftAdorner = control->GetValue() != 0;
  369.     info.lineLeftPen = dynamic_cast<CRsrcPopupMenu*>(this->FindSubPane("Line Left Pen"))->GetID();
  370.     
  371.     control = dynamic_cast<TControl*>(this->FindSubPane("TLineRightAdorner"));
  372.     info.hasLineRightAdorner = control->GetValue() != 0;
  373.     info.lineRightPen = dynamic_cast<CRsrcPopupMenu*>(this->FindSubPane("Line Right Pen"))->GetID();
  374.     
  375.     control = dynamic_cast<TControl*>(this->FindSubPane("TLineBottomAdorner"));
  376.     info.hasLineBottomAdorner = control->GetValue() != 0;
  377.     info.lineBottomPen = dynamic_cast<CRsrcPopupMenu*>(this->FindSubPane("Line Bottom Pen"))->GetID();
  378.     
  379.     control = dynamic_cast<TControl*>(this->FindSubPane("TLineTopAdorner"));
  380.     info.hasLineTopAdorner = control->GetValue() != 0;
  381.     info.lineTopPen = dynamic_cast<CRsrcPopupMenu*>(this->FindSubPane("Line Top Pen"))->GetID();
  382.     
  383.     control = dynamic_cast<TControl*>(this->FindSubPane("TRoundRectAdorner"));
  384.     info.hasRoundRectAdorner = control->GetValue() != 0;
  385.     info.roundRectPen = dynamic_cast<CRsrcPopupMenu*>(this->FindSubPane("Round Rect Pen"))->GetID();
  386.     
  387.     control = dynamic_cast<TControl*>(this->FindSubPane("TShadowedFrameAdorner"));
  388.     info.hasShadowAdorner = control->GetValue() != 0;
  389.     info.shadowColor = dynamic_cast<TColorSwatch*>(this->FindSubPane("Shadow Color"))->GetColor();
  390.     
  391.     control = dynamic_cast<TControl*>(this->FindSubPane("TSuppressDrawingAdorner"));
  392.     info.hasSupressAdorner = control->GetValue() != 0;
  393.     
  394.     return info;
  395. }
  396.  
  397.  
  398. //---------------------------------------------------------------
  399. //
  400. // CAdornerEditor::SetEditorInfo
  401. //
  402. //---------------------------------------------------------------
  403. void CAdornerEditor::SetEditorInfo(const SAdornerInfo& info)
  404. {    
  405.     TControl* control = nil;
  406.             
  407.     control = dynamic_cast<TControl*>(this->FindSubPane("TDefaultButtonAdorner"));
  408.     control->SetValue(info.hasDefaultButtonAdorner);
  409.     
  410.     control = dynamic_cast<TControl*>(this->FindSubPane("TEraseAdorner"));
  411.     control->SetValue(info.hasEraseAdorner);
  412.     dynamic_cast<TColorSwatch*>(this->FindSubPane("Erase Color"))->SetColor(info.eraseColor);
  413.     
  414.     control = dynamic_cast<TControl*>(this->FindSubPane("TFocusRectAdorner"));
  415.     control->SetValue(info.hasFocusAdorner);
  416.     
  417.     control = dynamic_cast<TControl*>(this->FindSubPane("TFrameAdorner"));
  418.     control->SetValue(info.hasFrameAdorner);
  419.     dynamic_cast<CRsrcPopupMenu*>(this->FindSubPane("Frame Pen"))->SetID(info.framePen);
  420.     
  421.     control = dynamic_cast<TControl*>(this->FindSubPane("TLineLeftAdorner"));
  422.     control->SetValue(info.hasLineLeftAdorner);
  423.     dynamic_cast<CRsrcPopupMenu*>(this->FindSubPane("Line Left Pen"))->SetID(info.lineLeftPen);
  424.     
  425.     control = dynamic_cast<TControl*>(this->FindSubPane("TLineRightAdorner"));
  426.     control->SetValue(info.hasLineRightAdorner);
  427.     dynamic_cast<CRsrcPopupMenu*>(this->FindSubPane("Line Right Pen"))->SetID(info.lineRightPen);
  428.     
  429.     control = dynamic_cast<TControl*>(this->FindSubPane("TLineBottomAdorner"));
  430.     control->SetValue(info.hasLineBottomAdorner);
  431.     dynamic_cast<CRsrcPopupMenu*>(this->FindSubPane("Line Bottom Pen"))->SetID(info.lineBottomPen);
  432.     
  433.     control = dynamic_cast<TControl*>(this->FindSubPane("TLineTopAdorner"));
  434.     control->SetValue(info.hasLineTopAdorner);
  435.     dynamic_cast<CRsrcPopupMenu*>(this->FindSubPane("Line Top Pen"))->SetID(info.lineTopPen);
  436.     
  437.     control = dynamic_cast<TControl*>(this->FindSubPane("TRoundRectAdorner"));
  438.     control->SetValue(info.hasRoundRectAdorner);
  439.     dynamic_cast<CRsrcPopupMenu*>(this->FindSubPane("Round Rect Pen"))->SetID(info.roundRectPen);
  440.     
  441.     control = dynamic_cast<TControl*>(this->FindSubPane("TShadowedFrameAdorner"));
  442.     control->SetValue(info.hasShadowAdorner);
  443.     dynamic_cast<TColorSwatch*>(this->FindSubPane("Shadow Color"))->SetColor(info.shadowColor);
  444.     
  445.     control = dynamic_cast<TControl*>(this->FindSubPane("TSuppressDrawingAdorner"));
  446.     control->SetValue(info.hasSupressAdorner);
  447. }
  448.  
  449.  
  450.  
  451.